/** @file

  Copyright 2006 - 2016 Unified EFI, Inc.<BR>
  Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>   

  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at 
  http://opensource.org/licenses/bsd-license.php
 
  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
**/
/*++

Module Name:

  SimpleFileSystem.h

Abstract:

  EFI Simple File System Protocol and EFI_FILE Protocol
    (define according to the EFI Spec, version 1.10)

--*/

#ifndef _SIMPLE_FILE_SYSTEM_FOR_TEST_H
#define _SIMPLE_FILE_SYSTEM_FOR_TEST_H

//#define _SIMPLE_FILE_SYSTEM_H_
//#define _FILE_INFO_H_
//#define _FILE_SYSTEM_INFO_H_
//#define _FILE_SYSTEM_VOLUME_LABEL_INFO_H_

#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \
  { 0x964e5b22, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }}

typedef struct _EFI_SIMPLE_FILE_SYSTEM_PROTOCOL EFI_SIMPLE_FILE_SYSTEM_PROTOCOL;
typedef struct _EFI_FILE EFI_FILE;

typedef
EFI_STATUS
(EFIAPI *EFI_VOLUME_OPEN) (
  IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL    *This,
  OUT EFI_FILE                          **Root
  )
/*++

  Routine Description:
    Open the root directory on a volume.

  Arguments:
    This - Protocol instance pointer.
    Root - Returns an Open file handle for the root directory

  Returns:
    EFI_SUCCES           - The device was opened.
    EFI_UNSUPPORTED      - This volume does not suppor the file system.
    EFI_NO_MEDIA         - The device has no media.
    EFI_DEVICE_ERROR     - The device reported an error.
    EFI_VOLUME_CORRUPTED - The file system structures are corrupted
    EFI_ACCESS_DENIED    - The service denied access to the file
    EFI_OUT_OF_RESOURCES - The volume was not opened due to lack of resources

--*/
;

#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION   0x00010000
#define EFI_FILE_PROTOCOL_REVISION1 0x00010000
#define EFI_FILE_PROTOCOL_REVISION2 0x00020000
#define EFI_FILE_PROTOCOL_REVISION EFI_FILE_PROTOCOL_REVISION2

typedef struct _EFI_SIMPLE_FILE_SYSTEM_PROTOCOL {
  UINT64                  Revision;
  EFI_VOLUME_OPEN         OpenVolume;
} EFI_SIMPLE_FILE_SYSTEM_PROTOCOL;


typedef
EFI_STATUS
(EFIAPI *EFI_FILE_OPEN) (
  IN EFI_FILE                 *File,
  OUT EFI_FILE                **NewHandle,
  IN CHAR16                   *FileName,
  IN UINT64                   OpenMode,
  IN UINT64                   Attributes
  )
/*++

  Routine Description:
    Open the root directory on a volume.

  Arguments:
    File       - Protocol instance pointer.
    NewHandle  - Returns File Handle for FileName
    FileName   - Null terminated string. "\", ".", and ".." are supported
    OpenMode   - Open mode for file.
    Attributes - Only used for EFI_FILE_MODE_CREATE

  Returns:
    EFI_SUCCES           - The device was opened.
    EFI_NOT_FOUND        - The specified file could not be found on the device
    EFI_NO_MEDIA         - The device has no media.
    EFI_MEDIA_CHANGED    - The media has changed
    EFI_DEVICE_ERROR     - The device reported an error.
    EFI_VOLUME_CORRUPTED - The file system structures are corrupted
    EFI_ACCESS_DENIED    - The service denied access to the file
    EFI_OUT_OF_RESOURCES - The volume was not opened due to lack of resources
    EFI_VOLUME_FULL      - The volume is full.

--*/
;

// Open modes
#define EFI_FILE_MODE_READ      0x0000000000000001
#define EFI_FILE_MODE_WRITE     0x0000000000000002
#define EFI_FILE_MODE_CREATE    0x8000000000000000

// File attributes
#define EFI_FILE_READ_ONLY      0x0000000000000001
#define EFI_FILE_HIDDEN         0x0000000000000002
#define EFI_FILE_SYSTEM         0x0000000000000004
#define EFI_FILE_RESERVED       0x0000000000000008
#define EFI_FILE_DIRECTORY      0x0000000000000010
#define EFI_FILE_ARCHIVE        0x0000000000000020
#define EFI_FILE_VALID_ATTR     0x0000000000000037

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_CLOSE) (
  IN EFI_FILE  *File
  )
/*++

  Routine Description:
    Close the file handle

  Arguments:
    File       - Protocol instance pointer.

  Returns:
    EFI_SUCCES - The device was opened.

--*/
;


typedef
EFI_STATUS
(EFIAPI *EFI_FILE_DELETE) (
  IN EFI_FILE  *File
  )
/*++

  Routine Description:
    Close and delete the file handle

  Arguments:
    File       - Protocol instance pointer.

  Returns:
    EFI_SUCCES              - The device was opened.
    EFI_WARN_DELETE_FAILURE - The handle was closed but the file was not
                              deleted

--*/
;

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_READ) (
  IN EFI_FILE                 *File,
  IN OUT UINTN                *BufferSize,
  OUT VOID                    *Buffer
  )
/*++

  Routine Description:
    Read data from the file.

  Arguments:
    File       - Protocol instance pointer.
    BufferSize - On input size of buffer, on output amount of data in
                 buffer.
    Buffer     - The buffer in which data is read.

  Returns:
    EFI_SUCCES           - Data was read.
    EFI_NO_MEDIA         - The device has no media
    EFI_DEVICE_ERROR     - The device reported an error
    EFI_VOLUME_CORRUPTED - The file system structures are corrupted
    EFI_BUFFER_TO_SMALL  - BufferSize is too small. BufferSize contains
                           required size

--*/
;

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_WRITE) (
  IN EFI_FILE                 *File,
  IN OUT UINTN                *BufferSize,
  IN VOID                     *Buffer
  )
/*++

  Routine Description:
    Write data from to the file.

  Arguments:
    File       - Protocol instance pointer.
    BufferSize - On input size of buffer, on output amount of data in buffer.
    Buffer     - The buffer in which data to write.

  Returns:
    EFI_SUCCES           - Data was written.
    EFI_UNSUPPORT        - Writes to Open directory are not supported
    EFI_NO_MEDIA         - The device has no media
    EFI_DEVICE_ERROR     - The device reported an error
    EFI_VOLUME_CORRUPTED - The file system structures are corrupted
    EFI_WRITE_PROTECTED  - The device is write protected
    EFI_ACCESS_DENIED    - The file was open for read only
    EFI_VOLUME_FULL      - The volume is full

--*/
;

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_SET_POSITION) (
  IN EFI_FILE                 *File,
  IN UINT64                   Position
  )
/*++

  Routine Description:
    Set a files current position

  Arguments:
    File     - Protocol instance pointer.
    Position - Byte possition from the start of the file

  Returns:
    EFI_SUCCES      - Data was written.
    EFI_UNSUPPORTED - Seek request for non-zero is not valid on open.

--*/
;

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_GET_POSITION) (
  IN EFI_FILE                 *File,
  OUT UINT64                  *Position
  )
/*++

  Routine Description:
    Get a files current position

  Arguments:
    File     - Protocol instance pointer.
    Position - Byte possition from the start of the file

  Returns:
    EFI_SUCCES      - Data was written.
    EFI_UNSUPPORTED - Seek request for non-zero is not valid on open.

--*/
;

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_GET_INFO) (
  IN EFI_FILE                 *File,
  IN EFI_GUID                 *InformationType,
  IN OUT UINTN                *BufferSize,
  OUT VOID                    *Buffer
  )
/*++

  Routine Description:
    Get information about a file

  Arguments:
    File            - Protocol instance pointer.
    InformationType - Type of info to return in Buffer
    BufferSize      - On input size of buffer, on output amount of data in
                      buffer.
    Buffer          - The buffer to return data.

  Returns:
    EFI_SUCCES           - Data was returned.
    EFI_UNSUPPORT        - InformationType is not supported
    EFI_NO_MEDIA         - The device has no media
    EFI_DEVICE_ERROR     - The device reported an error
    EFI_VOLUME_CORRUPTED - The file system structures are corrupted
    EFI_WRITE_PROTECTED  - The device is write protected
    EFI_ACCESS_DENIED    - The file was open for read only
    EFI_BUFFER_TOO_SMALL - Buffer was too small, required size returned in
                           BufferSize
--*/
;

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_SET_INFO) (
  IN EFI_FILE                 *File,
  IN EFI_GUID                 *InformationType,
  IN UINTN                    BufferSize,
  IN VOID                     *Buffer
  )
/*++

  Routine Description:
    Set information about a file

  Arguments:
    File            - Protocol instance pointer.
    InformationType - Type of info in Buffer
    BufferSize      - Size of buffer.
    Buffer          - The data to write.

  Returns:
    EFI_SUCCES           - Data was returned.
    EFI_UNSUPPORT        - InformationType is not supported
    EFI_NO_MEDIA         - The device has no media
    EFI_DEVICE_ERROR     - The device reported an error
    EFI_VOLUME_CORRUPTED - The file system structures are corrupted
    EFI_WRITE_PROTECTED  - The device is write protected
    EFI_ACCESS_DENIED    - The file was open for read only
--*/
;

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_FLUSH) (
  IN EFI_FILE  *File
  )
/*++

  Routine Description:
    Flush data back for the file handle

  Arguments:
    File  - Protocol instance pointer.

  Returns:
    EFI_SUCCES           - Data was written.
    EFI_UNSUPPORT        - Writes to Open directory are not supported
    EFI_NO_MEDIA         - The device has no media
    EFI_DEVICE_ERROR     - The device reported an error
    EFI_VOLUME_CORRUPTED - The file system structures are corrupted
    EFI_WRITE_PROTECTED  - The device is write protected
    EFI_ACCESS_DENIED    - The file was open for read only
    EFI_VOLUME_FULL      - The volume is full

--*/
;

#if EFI_FILE_HANDLE_REVISION >= 0x00020000

#define FILEIOENTITY_SIGNATURE   EFI_SIGNATURE_32('f','i','o','2')

typedef struct {
  EFI_EVENT                Event;
  EFI_STATUS               Status;
  UINTN                    BufferSize;
  VOID                     *Buffer;
} EFI_FILE_IO_TOKEN;

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_OPEN_EX) (
  IN EFI_FILE               *File,
  OUT EFI_FILE              **NewHandle,
  IN CHAR16                 *FileName,
  IN UINT64                 OpenMode,
  IN UINT64                 Attributes,
  IN OUT EFI_FILE_IO_TOKEN  *Token
  )
/*++

  Routine Description:
    Opens a new file relative to the source directorys location

  Arguments:
    File             - Protocol instance pointer.
    NewHandle  - Returns File Handle for FileName
    FileName     - Null terminated string. "\", ".", and ".." are supported
    OpenMode   - Open mode for file.
    Attributes    - Only used for EFI_FILE_MODE_CREATE
    Token          - A pointer to the token associated with the transaction

  Returns:
    EFI_SUCCES                     - The device was opened.
    EFI_NOT_FOUND               - The specified file could not be found on the device
    EFI_NO_MEDIA                 - The device has no media.
    EFI_MEDIA_CHANGED       - The media has changed
    EFI_DEVICE_ERROR          - The device reported an error.
    EFI_VOLUME_CORRUPTED - The file system structures are corrupted
    EFI_ACCESS_DENIED        - The service denied access to the file
    EFI_OUT_OF_RESOURCES - The volume was not opened due to lack of resources
    EFI_VOLUME_FULL            - The volume is full.

--*/
;

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_READ_EX) (
  IN EFI_FILE                  *File,
  IN OUT EFI_FILE_IO_TOKEN     *Token
);
/*++

  Routine Description:
    Read data from the file.

  Arguments:
    File         - Protocol instance pointer.
    Token      - A pointer to the token associated with the transaction.

  Returns:
    EFI_SUCCES                     - Data was read.
    EFI_NO_MEDIA                 - The device has no media
    EFI_DEVICE_ERROR          - The device reported an error
    EFI_VOLUME_CORRUPTED - The file system structures are corrupted
    EFI_BUFFER_TO_SMALL    - BufferSize is too small. BufferSize contains required size

--*/

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_WRITE_EX) (
  IN EFI_FILE                *File,
  IN OUT EFI_FILE_IO_TOKEN   *Token
)
/*++

  Routine Description:
    Write data from to the file.

  Arguments:
    File       - Protocol instance pointer.
    BufferSize - On input size of buffer, on output amount of data in buffer.
    Buffer     - The buffer in which data to write.

  Returns:
    EFI_SUCCES           - Data was written.
    EFI_UNSUPPORT        - Writes to Open directory are not supported
    EFI_NO_MEDIA         - The device has no media
    EFI_DEVICE_ERROR     - The device reported an error
    EFI_VOLUME_CORRUPTED - The file system structures are corrupted
    EFI_WRITE_PROTECTED  - The device is write protected
    EFI_ACCESS_DENIED    - The file was open for read only
    EFI_VOLUME_FULL      - The volume is full

--*/
;

typedef
EFI_STATUS
(EFIAPI *EFI_FILE_FLUSH_EX) (
  IN EFI_FILE                *File,
  IN OUT EFI_FILE_IO_TOKEN   *Token
)
/*++

  Routine Description:
    Flush data back for the file handle

  Arguments:
    File  - Protocol instance pointer.

  Returns:
    EFI_SUCCES           - Data was written.
    EFI_UNSUPPORT        - Writes to Open directory are not supported
    EFI_NO_MEDIA         - The device has no media
    EFI_DEVICE_ERROR     - The device reported an error
    EFI_VOLUME_CORRUPTED - The file system structures are corrupted
    EFI_WRITE_PROTECTED  - The device is write protected
    EFI_ACCESS_DENIED    - The file was open for read only
    EFI_VOLUME_FULL      - The volume is full

--*/
;
#endif

#if EFI_FILE_HANDLE_REVISION >= 0x00020000
  #define EFI_FILE_HANDLE_REVISION         0x00020000

  struct _EFI_FILE {
    UINT64                  Revision;
    EFI_FILE_OPEN           Open;
    EFI_FILE_CLOSE          Close;
    EFI_FILE_DELETE         Delete;
    EFI_FILE_READ           Read;
    EFI_FILE_WRITE          Write;
    EFI_FILE_GET_POSITION   GetPosition;
    EFI_FILE_SET_POSITION   SetPosition;
    EFI_FILE_GET_INFO       GetInfo;
    EFI_FILE_SET_INFO       SetInfo;
    EFI_FILE_FLUSH          Flush;
    EFI_FILE_OPEN_EX        OpenEx;
    EFI_FILE_READ_EX        ReadEx;
    EFI_FILE_WRITE_EX       WriteEx;
    EFI_FILE_FLUSH_EX       FlushEx;
  };
#else
  #define EFI_FILE_HANDLE_REVISION         0x00010000

  struct _EFI_FILE {
    UINT64                  Revision;
    EFI_FILE_OPEN           Open;
    EFI_FILE_CLOSE          Close;
    EFI_FILE_DELETE         Delete;
    EFI_FILE_READ           Read;
    EFI_FILE_WRITE          Write;
    EFI_FILE_GET_POSITION   GetPosition;
    EFI_FILE_SET_POSITION   SetPosition;
    EFI_FILE_GET_INFO       GetInfo;
    EFI_FILE_SET_INFO       SetInfo;
    EFI_FILE_FLUSH          Flush;
  };
#endif

typedef struct _EFI_FILE *EFI_FILE_HANDLE;

extern EFI_GUID gBlackBoxEfiSimpleFileSystemProtocolGuid;

#endif
